package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import Negocio.ItemFactura;
import Negocio.ItemPlan;
import Negocio.Linea;
import Negocio.LineaTitular;
import Negocio.Plan;
import Negocio.PlanAdicional;
import Negocio.PlanBase;
import Negocio.PlanPrepago;
import Negocio.Usuario;

public class AdministradorPersistenciaPlan {

private static AdministradorPersistenciaPlan pool;
	
	
	private AdministradorPersistenciaPlan()
	{
		
	}
	public static AdministradorPersistenciaPlan getInstancia()
	{
		if (pool== null)
			pool =new AdministradorPersistenciaPlan();
		return pool;
	}
	
	public void insert(Plan p, String tipo)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Planes (nro_Plan, nombre, costo_base, tipo) VALUES (?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,p.getNumero());
			ps.setString(2,p.getNombre());
			ps.setFloat(3,p.getCostoBase());
			ps.setString(4,tipo);
			
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Plan: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Plan: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	public void insertItemPlan(int numeroPlan, ItemPlan item){
		
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			
			//Insertar Item Plan
			PreparedStatement ps = con.prepareStatement("INSERT INTO Items_Plan (nro_Plan, nombre_Servicio, unidades_libre, costo_Adicional) VALUES (?,?,?,?)");
			ps.setInt(1, numeroPlan);
			ps.setString(2, item.getServicio().getNombre());
			ps.setInt(3, item.getUnidadesLibres());	
			ps.setDouble(4, item.getCostoAdicional());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void update(Plan p)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try{
			String sentence = "UPDATE Planes SET nombre = ?, costo_base = ? WHERE nro_Plan = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(sentence);
			ps.setString(1, p.getNombre());
			ps.setFloat(2, p.getCostoBase());
			ps.setInt(3, p.getNumero());
			
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch(Exception e){
			System.out.println("Mensaje Error al Actualizar Plan " + e.getMessage());
			System.out.println("Stack trace al Actualizar Plan " + e.getMessage());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}
	
	public void delete (Plan p)
	{
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try{
			String sentence1 = "DELETE FROM Items_Plan WHERE nro_Plan = ?";
			String sentence2 = "DELETE FROM Planes WHERE nro_Plan = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(sentence1);
			ps.setInt(1, p.getNumero());
			ps.execute();
			ps = con.prepareStatement(sentence2);
			ps.setInt(1, p.getNumero());
			ps.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		catch(Exception e){
			System.out.println("Mensaje Error al Borra Plan o Item_Plan " + e.getMessage());
			System.out.println("Stack trace al Borra Plan o Item_Plan " + e.getMessage());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
	}
	
	public String getTipo (int numeroPlan) //Devuelve el valor del tipo de Plan: "Base", "Prepago" o "Adicional"
	{
		
		String tipoPlan = null;
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia select en tabla destino
			String senten = "SELECT tipo from Planes where nro_Plan = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,numeroPlan);
			ResultSet result = ps.executeQuery();
			while (result.next())
				tipoPlan = result.getString("tipo");
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return tipoPlan;
		}
	    catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Plan Base: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Plan Base: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	     return tipoPlan;	
	}
	
	public PlanBase buscarPlanBase(int numeroPlan)
	{
		PlanBase pb = null;
		ItemPlan i = null;
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia select en tabla destino
			String senten = "SELECT nombre,costo_base,tipo from Planes where nro_Plan = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,numeroPlan);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				pb = new PlanBase ();
				pb.setNumero(result.getInt("nro_Plan"));
				pb.setNombre(result.getString("nombre"));
            	pb.setCostoBase(result.getFloat("costo_base"));
			}
			if (pb != null) {
				ps = con.prepareStatement("SELECT nombre_Servicio,unidades_libre,costo_Adicional from Items_Plan where nro_Plan = ?");		
				ps.setInt(1,numeroPlan);
				result = ps.executeQuery();
				while (result.next())
				{
					i = new ItemPlan ();
					i.setServicio(AdministradorPersistenciaServicio.getInstancia().buscarServicio(result.getString("nombre_Servicio")));
					i.setUnidadesLibres(result.getInt("unidades_libre"));
					i.setCostoAdicional(result.getDouble("costo_Adicional"));
					pb.addItemPlan(i);
				}
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return pb;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Plan Base: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Plan Base: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return pb;
	}
	
	public PlanPrepago buscarPlanPrepago(int numeroPlan)
	{
		PlanPrepago pp = null;
		ItemPlan i = null;
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia select en tabla destino
			String senten = "SELECT nombre,costo_base,tipo from Planes where nro_Plan = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,numeroPlan);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				pp = new PlanPrepago ();
				pp.setNumero(result.getInt("nro_Plan"));
				pp.setNombre(result.getString("nombre"));
            	pp.setCostoBase(result.getFloat("costo_base"));
			}
			if (pp != null) {
				ps = con.prepareStatement("SELECT nombre_Servicio,unidades_libre,costo_Adicional from Items_Plan where nro_Plan = ?");		
				ps.setInt(1,numeroPlan);
				result = ps.executeQuery();
				while (result.next())
				{
					i = new ItemPlan ();
					i.setServicio(AdministradorPersistenciaServicio.getInstancia().buscarServicio(result.getString("nombre_Servicio")));
					i.setUnidadesLibres(result.getInt("unidades_libre"));
					i.setCostoAdicional(result.getDouble("costo_Adicional"));
					pp.addItemPlan(i);
				}
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return pp;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Plan Prepago: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Plan Prepago: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return pp;
	}
	
	public PlanAdicional buscarPlanAdicional(int numeroPlan)
	{
		PlanAdicional pa = null;
		ItemPlan i = null;
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia select en tabla destino
			String senten = "SELECT nombre,costo_base,tipo from Planes where nro_Plan = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,numeroPlan);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				pa = new PlanAdicional ();
				pa.setNumero(result.getInt("nro_Plan"));
				pa.setNombre(result.getString("nombre"));
            	pa.setCostoBase(result.getFloat("costo_base"));
			}
			if (pa != null) {
				ps = con.prepareStatement("SELECT nombre_Servicio,unidades_libre,costo_Adicional from Items_Plan where nro_Plan = ?");		
				ps.setInt(1,numeroPlan);
				result = ps.executeQuery();
				while (result.next())
				{
					i = new ItemPlan ();
					i.setServicio(AdministradorPersistenciaServicio.getInstancia().buscarServicio(result.getString("nombre_Servicio")));
					i.setUnidadesLibres(result.getInt("unidades_libre"));
					i.setCostoAdicional(result.getDouble("costo_Adicional"));
					pa.addItemPlan(i);
				}
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return pa;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Buscar Plan Adicional: " + e.getMessage());
				System.out.println("Stack Trace al Buscar Plan Adicional: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return pa;
	}
	

}
